package org.cyb.demo.controller;

import org.cyb.demo.common.HrmConstants;
import org.cyb.demo.domain.*;
import org.cyb.demo.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Controller
@RequestMapping(value = "/course")
public class CourseController {

    @Autowired
    @Qualifier("courseService")
    private CourseService courseService;

    @Autowired
    @Qualifier("majorService")
    private MajorService majorService;

    @Autowired
    private ChapterService chapterService;

    @Autowired
    private SectionService sectionService;

    @Autowired
    private PptService pptService;

    @Autowired
    private VideoService videoService;

    //学习页面：学生用于通过学院专业获取课程列表
    //管理员通过系名搜索课程
    @RequestMapping(value = "/getByMajorName")
    public ModelAndView getCourse(
            Major major,
            HttpSession session,
            //使用ModelAndView类用来存储处理完后的结果数据，以及显示该数据的视图
            ModelAndView modelAndView){
        //得到课程列表
        List<Course> courseList = courseService.getByMajorName(major);
        //使用addObject()设置需要返回的值，addObject()有几个不同参数的方法，可以默认和指定返回对象的名字。
        modelAndView.addObject("courseList", courseList);
        User sessionUser = (User) session.getAttribute(HrmConstants.USER_SESSION);
        int admin = 1;
        //可以通过setViewName()方法跳转到指定的页面
        if (sessionUser.getUserStatus() == admin){
            modelAndView.setViewName("admin/CourseShow");
        }
        else {
            modelAndView.setViewName("student/coursepage");
        }
        return modelAndView;
    }

    //点击课程信息跳转到课程信息页面
    @RequestMapping(value = "/showCoursePage")
    public ModelAndView showCoursePage(ModelAndView modelAndView){
        List<Course> courseList = courseService.getAll();
        modelAndView.addObject("courseList",courseList);
        modelAndView.setViewName("admin/CourseShow");
        return modelAndView;
    }

    //课程信息页面：管理员通过课程名搜索课程
    @RequestMapping(value = "/getByCourseName")
    public ModelAndView selectByCourseName(
            Course course,
            ModelAndView modelAndView
    ){
        List<Course> courseList = courseService.getByCourseName(course);
        modelAndView.addObject("courseList",courseList);
        modelAndView.setViewName("admin/CourseShow");
        return modelAndView;
    }

    //课程信息页面：删除课程并跳转回课程信息页面
    @RequestMapping(value = "/deleteByName")
    public ModelAndView deleteByName(
            Course course,
            ModelAndView modelAndView
    ){
        courseService.delete(course);
        modelAndView.setViewName("admin/CourseShow");
        return modelAndView;
    }

    //点击创建课程，跳转到创建课程页面
    @RequestMapping(value = "/addCoursePage")
    public ModelAndView addCoursePage(
            ModelAndView modelAndView
    ) {
        modelAndView.setViewName("admin/CourseCreate");
        return modelAndView;
    }

    //创建课程
    @RequestMapping(value = "/addCourse")
    public ModelAndView addCourse(
            Course course,
            Major major,
            @RequestParam("chapters")String chapters,
            HttpServletRequest request,
            HttpSession httpSession,
            ModelAndView modelAndView
    ) throws IOException {
//        根据MajorName获得Major的Id，插入course要用
        int majorId = majorService.returnIdByName(major);
        major.setMajorId(majorId);
//        先把course信息插进数据库，目的是更新其course_id，后面插chapter要用
        courseService.add(course,major);
        MultipartHttpServletRequest params=(MultipartHttpServletRequest) request;
        //创建一个章数组，用“;”分隔每章的名称
        // split() 方法用于把一个字符串分割成字符串数组。
        //chapters就是前端传过来的全部章名称
        String[] chapterArray = chapters.split(";");
        //章
        for (String chapterName:chapterArray) {
            //parseInt() 函数可解析一个字符串,并返回一个整数。
            //substring() 方法用于提取字符串中介于两个指定下标之间的字符。
            //indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
            int chapterNumber = Integer.parseInt(chapterName.substring(chapterName.indexOf("第")+1,chapterName.indexOf("章")));
            Chapter chapter = new Chapter();
            chapter.setChapterName(chapterName);
            chapter.setChapterNumber(chapterNumber);
            //先把chapter信息插进数据库，目的是更新其chapter_id，后面插PPT和Video要用
            chapterService.add(chapter,course);
            course.getChapterList().add(chapter);
        }


//        lastChapterNumber用来记录最近处理过的章节数，默认起始是第一章
        int lastChapterNumber = 1;
//        在服务器上创建用于存储ppt的文件夹
        //先设置路径，然后新建一个该路径的文件夹
        String pptPath = httpSession.getServletContext().getRealPath("/upload/ppt/");
        //separator:与系统有关的默认名称分隔符
        pptPath = pptPath + File.separator + course.getCourseName();
        File pptDirectory = new File(pptPath);
        //mkdirs() : mkdirs()可以建立多级文件夹  创建此抽象路径名指定的目录，包括创建必需但不存在的父目录。
        pptDirectory.mkdirs();
//        pptList用来存储每个chapter对应的pptList
        List<Ppt> pptList = new ArrayList<Ppt>();
//        从前端获取上传的ppt文件，存到List里面
        List<MultipartFile> multipartFileList = params.getFiles("ppts");
        for (MultipartFile file:multipartFileList) {
//            解析出ppt文件的名字
            String pptName = file.getOriginalFilename();
            Ppt ppt = new Ppt();
            ppt.setPptName(pptName);
//            把pptName第一个“.”之前的字符串（第几章）取出来，转成int（chapterList的索引）
            int chapterNumber = Integer.parseInt(pptName.trim().split("\\.")[0]);
//            把pptName第一个“.”之后的字符串取出来再以空格切割出小节数，转成int（chapterList的索引）
            int sectionNumber = Integer.parseInt(pptName.trim().split("\\.")[1].split("\\s+")[0]);
            //给节命名
            int indexOf = pptName.indexOf(".ppt");
            String sectionName = pptName.substring(0,pptName.indexOf(".ppt"));
            //创建节
            Section section = new Section();
            section.setSectionName(sectionName);
            section.setSectionNumber(sectionNumber);
//            为对应chapter增加一个section（一个文件一个section）
            course.getChapterList().get(chapterNumber-1).getSectionList().add(section);
//            设置对应章节的小节名
            course.getChapterList().get(chapterNumber-1).getSectionList().get(sectionNumber-1).setSectionName(sectionName);
//            把section信息插入数据库
            sectionService.add(section,course.getChapterList().get(chapterNumber-1));
//            把ppt填进相应section的pptList中
            course.getChapterList().get(chapterNumber-1).getSectionList().get(sectionNumber-1).getPptList().add(ppt);
//            上传ppt文件
            file.transferTo(new File(pptDirectory + File.separator + pptName));
//            把ppt信息插入数据库
            pptService.add(ppt,course.getChapterList().get(chapterNumber-1).getSectionList().get(sectionNumber-1));
        }

//        在服务器上创建用于存储video的文件夹
        String videoPath = httpSession.getServletContext().getRealPath("/upload/video/");
        videoPath = videoPath + File.separator + course.getCourseName();
        File videoDirectory = new File(videoPath);
        videoDirectory.mkdirs();
//        videoList用来存储每个chapter对应的videoList
        List<Video> videoList = new ArrayList<Video>();
//        从前端获取上传的video文件
        List<MultipartFile> videos = params.getFiles("videos");
        for (MultipartFile multipartFile:videos) {
//            解析出video文件的名字
            String videoName = multipartFile.getOriginalFilename();
            Video video = new Video();
            video.setVideoName(videoName);
//            把videoName第一个“.”之前的字符串（第几章）取出来，转成int（chapterList的索引）
            int chapterNumber = Integer.parseInt(videoName.trim().split("\\.")[0]);
//            把videoName第一个“.”之后的字符串取出来再以空格切割出小节数，转成int（chapterList的索引）
            int sectionNumber = Integer.parseInt(videoName.trim().split("\\.")[1].split("\\s+")[0]);
//            把video填进相应section的videoList中
            course.getChapterList().get(chapterNumber-1).getSectionList().get(sectionNumber-1).getVideoList().add(video);
//            上传video文件
            multipartFile.transferTo(new File(videoDirectory + File.separator + videoName));
//            把video信息插入数据库
            videoService.add(video,course.getChapterList().get(chapterNumber-1).getSectionList().get(sectionNumber-1));
        }

        String imgPath = httpSession.getServletContext().getRealPath("/upload/img/");
        imgPath = imgPath + File.separator + course.getCourseName();
        File imgDirectory = new File(imgPath);
        imgDirectory.mkdirs();
//        上传CourseImage
        course.getCourseImg().transferTo(new File(imgDirectory + File.separator + course.getCourseImg().getOriginalFilename()));

        modelAndView.setViewName("admin/CourseShow");
        return modelAndView;
    }


    //学习页面：在点击课程名称时跳转到学习资源页面
    @RequestMapping(value = "/studyPage")
    public ModelAndView studyPage(
            Course course,
            ModelAndView modelAndView
    ) {
        Course returnCourse = courseService.getOneByName(course);
//        将section排序
        for (Chapter chapter:returnCourse.getChapterList()) {
            chapter.getSectionList().sort(Section::compareTo);
        }
//        将chapter排序
        returnCourse.getChapterList().sort(Chapter::compareTo);
        modelAndView.addObject("course",returnCourse);
        modelAndView.setViewName("student/study");
        return modelAndView;
    }
}
